ПРОПИСНЫЕ-СТРОЧНЫЕ
БУКВЫ - СОВЕТ ПО СЛЕЖЕНИЮ ЗА РЕГИСТРОМ
1 УПРАВЛЕНИЕ СОБЫТИЯМИ
В КОМБОБОКСЕ
Две проблемы могут
приключиться, когда смущенный юзер ползает по
комбобоксу при помощи мышки вверх и вниз, а затем
нажатием на Enter делает свой юзерский выбор.
Во-первых, нажатие на серую стрелочку вызывает
два события: Change и Click. Во-вторых, нажатие на Enter
перемещает фокус к следующему элементу формы,
тогда как нажатие на кнопку мыши не вызывает
подобного эффекта (т.е. фокус остается на
комбобоксе). Поэтому, если Ваш код помещен в
секцию события Change, то на стрелочки вверх/вниз
(клавиатурой) вызовет это событие, чего Вы,
естественно, не хотите. Напротив, если Вы
помещаете свой код только в секцию события Lost Focus
и юзер щелкает мышью на своем выборе, то фокус не
уйдет из комбобокса, а юзер будет созерцать
текст, который он выбрал своей мышью, и думать,
почему это ничего не происходит. Нижеприведенное
решение «фильтрует базар» событий Click,
генерирующихся нажатиями на стрелочки
клавиатуры, и вынуждает контрол потерять фокус.В
секции Declarations формы введите следующее
' В VB3 надо поменять тип флага на
integer
Dim bNoise as Boolean
' True означает, что происходит «шум», на который не
следует реагировать
А этот код введите в секции
события Form_Load:
bNoise = False
Этот код
введите в событии KeyDown комбобокса:
Private Sub cbTest_KeyDown(KeyCode As _
Integer, Shift As Integer)
' если юзер использует
стрелки для езды по списку комбобокса
' игнорировать события Click
If KeyCode = vbKeyDown Or KeyCode _
= vbKeyUp Then bNoise = True
End Sub
Этот код вводится в событии Click
комбобокса:
Private Sub cbTest_Click()
If bNoise Then
' Ignore Noise events
' (up or down arrow)
bNoise = False
Else
' Увести фокус с контрола
SendKeys "{TAB}", True
End If
End Sub
Теперь Вам остается написать
код, содержащий реакцию на выбор юзера, и занести
его в секцию события LostFocus комбика.
2. КОММЕНТИРОВАНИЕ И
РАСКОММЕНТИРОВАНИЕ БЛОКОВ КОДА
VB5
Level: Beginning
VB 5.0 позволяет Вам разом
закомментировать целый блок кода, а затем также
быстро раскомментировать его. Это очень полезно
при отладке, когда Вам не нужно исполнять целый
ряд операторов, и в то же время Вы не можете их
удалить вот так вот просто за здорово живешь.
Между тем, пара кнопарей Comment/Uncomment присутствует
только в тулбаре Edit, который надо специально
вызывать :-(. Чтобы быстро вызвать тулбар Edit,
кликните правой кнопкой мыши на любом тулбаре в
VB, и выберите затем команду Edit.
3. ЗНАЧЕНИЯ ПО
УМОЛЧАНИЮ ДЛЯ НЕОБЯЗАТЕЛЬНЫХ ПАРАМЕТРОВ
VB5
Level: Beginning
Если Вы когда-либо программили
на VB4, то Вы возможно пользовались мощной фишкой
под названием Необязательные параметры (Optional
parameters). VB5 пошел еще дальше: теперь эти параметры
могут быть любого типа (не только Variants), и могут
появляться в процедурах Property. Интересно, что Вы
можете теперь задавать для них значение по
умолчанию.
Property Get Value _
(Optional index As Long = 1)
End Property
Вы можете теперь делать это без
бывшего ранее обязательным (и жутко тормозным)
тестом IsMissing:
Property Get Value _
(Optional index As Long)
If IsMissing(index) Then index = 1
...
End Property
4. НЕ СОЗДАВАЙТЕ ALIAS-НЫХ
ПЕРЕМЕННЫХ
VB5
Level: Beginning
Никогда не передавайтe
глобальную переменную в качестве аргумента в
процедуру, которая также напрямую обращается к
этой переменной из себя (зачем??). Если Вы на 100%
уверены, что следуете этому правилу в Ваших
программах, то зачеркните опцию Assume No Aliasing в
диалоговом окне Advanced Optimizations, которое вызывается
из пункта Compile диалога Project Properties (уф, надеюсь,
понятно). Если компилятор native code знает, что этих
самых alias-ных переменных нет, то он спокойно
копирует значения переменных в шустрые регистры
ЦПУ, и переписывает их значения обратно в RAM
только при выходе из процедуры. Это увеличивает
скорость исполнения скомпилированных программ.
5. ЦЕНТРИРОВАНИЕ ФОРМЫ
НА ЭКРАНЕ
VB5
Level: Beginning
Все знают о маленьком кодике,
позволяющем Вам центрировать форму на экране вне
зависимости от графического разрешения. Теперь
Вы можете достичь того же результата, всего лишь
присвоив значение vbStartUpScreen (=2) новому свойству
StartUpPosition формы (появилось в версии 5). Вы даже
можете отцентрировать форму относительно ее
родительского окна, присвоив значение vbStartUpOwner
(=1). Присвоение можно сделать в окне Property
соответствующей формы. Когда Вы центрируете
форму внутри родительского окна, не забудьте
добавить второй аргумент в методе Show.
Form2.Show vbModal, Me
6. НЕ УВЛЕКАЙТЕСЬ
АВТООПТИМИЗИЦИЕЙ FAST CODE
VB5
Level: Beginning
Если взглянуть на опции native code
оптимизации, то сперва так и подмывает щелкнуть
на "Optimize for Fast Code". Однако, как ни странно это
может прозвучать, данное действие далеко не
всегда гарантирует ожидаемый эффект. Аппликухи,
оптимизированные на скоростное исполнение, как
правило, не оптимизируются (пардон за каламбур), а
лишь получают большее количество памяти при
загрузке. Это обращается для них более медленной
загрузкой, что особенно заметно на машинах с
недостаточным количеством RAM, и в итоге создает
впечатление, что Ваша аппликуха работает
медленнее, нежели оптимизированная под
компактный код. По той же самой причине,
советуется компилить аппликухи в P-code. В случае
объемных, UI- и базоданских аппликух, выигрыш от
компиляции в native-code отнюдь не перевесит
увеличения размера аппликухи. Вообще, чтобы
точно знать, какая компиляция нужна Вам, юзайте VB
Application Performance Explorer (APE), который лежит на VB CD.
7. НЕ ВСЕ ШАБЛОНЫ
СОЗДАНЫ ОДИНАКОВО
VBA5
Level: Beginning
В отличие от других продуктов
Office 97, шаблоны Word 97 содержат business-application engine,
который хранится отдельно от документов,
использюущих этот engine. Основанные на шаблонах
книги Excel и презентации PowerPoint хранят в себе
шаблоны, на основе которых они созданы. На
практике, все документы Word состоят из 2х VBA
проектов: первый проект создан на базе
основного(оригинального, хранящегося в Word)
шаблона (все документы Word основаны на шаблонах), а
второй проект принадлежит самому документу Word. С
другой стороны, книги Excel и презентации PowerPoint,
созданные на шаблонах, содержат только один VBA
проект. Каждый файл содержит свою собственную
копию проекта оригинального шаблона. Изменения,
производимые в этом шаблоне, не затрагивают
основной шаблон, хранящийся в приложении.
8. НАСТРОЙКА ТУЛБАРОВ В
VB
VB5
Level: Beginning
Вот несколько предложений по
настройке IDE в VB5:
Добавить закладки в тулбокс можно, кликнув
правой кнопкой мыши на кнопке General (что на
тулбоксе), и выбрав Add Tab. Вы можете также
перемещать и удалять закладки, и перемещать
иконы контролов с одной закладки на другую,
используя обычный метод drag-and-drop.
Вытащить кнопку любого пункта меню на тулбар
можно, кликнув правой кнопкой на любом тулбаре и
выбрав пункт Customize. Перейдите на закладку Commands,
выберите нужный пункт меню в правом окошке, и
перетащите его на тулбар. Первыми кандидатами на
добавление являются пункты Project-References,Project-Properties,
и Tools-Add Procedure.
Как создать совершенно новый тулбар на вкладке
Toolbars диалогового окна Customize. После того, как Вы
определили содержимое будущего тулбара, для
добавления кнопок на этот тулбар используйте
описанную абзацем выше процедуру. Когда у Вас на
экране активизировано диалоговое окно Customize,
кликните правой кнопкой на любой кнопке тулбара
и Вы сможете поменять рисунок кнопки, создать
разделитель, спрятать/показать текст и т.д.
9. КАК СПРЯТАТЬ ВСЕ
ОКОШКИ ПРОЕКТА
VB5
Level: Beginning
Когда Вы работаете с
несколькими пректами сразу, можно запутаться в
нагромождении туевой хучи окошек из разных
проектов. Однако, Вы можете временно спрятать все
окошки, относящиеся к данному проекту, щелкнув по
пиктограмме проекта в окошке Project Explorer так, чтобы
все ветви, торчащие из него, исчезли. Тогда же
свернутся и все окна, относящиеся к данному
проекту. Эту возможность можно отменить, щелкнув
на сответствующем квадратике на закладке General в
меню Tools-Options.
10. STANDALONE БИБЛИОТЕКИ
ТИПОВ
VB4 16/32, VB5 (Enterprise Edition)
Level: Intermediate
Koгда Вы создаете Ваш out-of-process OLE
сервер, то VB встраивает библиотеку типов сервера
(companion type library) в EXE-файл, не генерируя при этом .TLB
файл. Однако, если у Вас Enterprise Edition VB4 или VB5, то
зачеркнув квадратик Remote Server File, Вы заставите VB
создавать standalone билиотеку типов. В VB5, эта опция
находится на вкладке Component диалогового окна
Properties меню Project.
11. ИСПОЛЬЗОВАНИЕ OBJECT
BROWSER’a длЯ нахождениЯ недокументированных
возможностей
VB5
Level: Intermediate
Если кликнуть правой кнопкой мыши в правом
окошке Object Browser’а (там, где нарисованы члены
классов), то выскочит контекстное меню с командой
Show Hidden Members. Если щелкнуть на этой команде, то
отныне Object Browserбудет показывать все hidden-свойства
и методы (а также и классы) любой библиотеки, и Вы
можете использовать это для более детального
исследования библиотек объектов.
Например, в библиотеке VBA есть hidden класс под
названием _HiddenModule, в который входят многие
известные функции VBA плюс три
недокументированные: ObjPtr, StrPtr, и VarPtr. ObjPtr
возвращает адрес private area экземпляра объекта, StrPtr
возвращает адрес первого символа в строке, VarPtr
возвращает адрес переменной или дескриптора
строки (string descriptor), если имеем случай переменной
типа string.
12. АДРЕС ПЕРЕМЕННОЙ
VB4 16/32
Level: Advanced
В VB5 есть встроенная функция VarPtr
(см. Совет «ИСПОЛЬЗОВАНИЕ OBJECT BROWSER’a
длЯнахождениЯ недокументированных
возможностей»), но этой функции нет в VB4. Runtime library
в VB4 включает эту функцию, но перед
использованием ее нужно сначала объявить:
#If Win16 Then
Declare Function VarPtr Lib "VB40016.DLL" (variable As Any) As Long
#Else
Declare Function VarPtr Lib "VB40032.DLL" (variable As Any) As
Long
#End If
Эта функция полезна при
передаче пользовательских типов (Type structure) во
внешнюю процедуру API, и в этом типе какое-либо из
полей является адресом другой переменной или
записи.
13. КОГДА BENCHMARK’и
(ИЗМЕРЕНИЯ СКОРОСТИ РАБОТЫ ПРОГИ) ДЛЯТСЯ СУТКАМИ
VB4 16/32, VB5
Level: Intermediate
Обычно, программисты на VB
измеряют скорость выполнения кода при помощи Timer
функции. Однако, если Ваша программа должна
завершиться на следующий день, то Вы должны
учесть, что значение, возвращаемое функцией Timer,
ресетится в полночь. Если же Вас устроит значение
с точностью до одной секунды, Вы можете упростить
Ваш код с помощью функции Now.
Dim startTime As Date
StartTime = Now
' the code to be benchmarked
' ...
Print "elapsedSeconds = " & Format$ ((Now - startTime) * 86400,
"#####")
Вам понадобится функция Format$
для округления результата до целого.
14. APP.PATH МОЖЕТ
ВОЗВРАЩАТЬ UNC-ПУТИ
VB5
Level: Intermediate
В отличие от VB4, App.Path в VB5 может
возвращать UNC-путь, типа "\\server\programs\...", в
зависимости от обстоятельств, от того как
запущена программа и запущена она из VB IDE или
скомпилирована в EXE-файл. Эта особенность может
сильно испортить вам жизнь, если Вы используете
App.Path для установки текущего каталога при старте
программы.
ChDrive App.Path
ChDir App.Path
Поскольку ChDrive на умеет
обрабатывать UNC-пути, этот код может вызвать
фатальную ошибку времени выполнения, но можт
быть защищен использованием On Error Resume Next. Однако
этот фикс не защитит Вас от всех невзгод, могущих
произойти. Наилучшее решение состоит в том, чтоюы
предоставить юзеру самому ввести каталог во
время исполнения программы, затем записать
полученный путь в регистр или INI-файл. Для более
подробной инфы, см. статью Q167167 в Microsoft Knowledge Base.
15 ЕЩЕ ОБ
УНИВЕРСАЛЬНЫХ ПАРАМЕТРАХ МАССИВОВ
VB4 16/32, VB5
Level: Advanced
Вы можете написать единую процедуру для любых
типов массива с любым типом в качестве
аргумента, используя параметр типа Variant. Внутри
процедуры, адресация элементов массива
происходит обычным способом:
' return the number of items
Function ItemCount(anArray As Variant) As Long
ItemCount = UBound(anArray) - LBound(anArray) + 1
' the first element is
' anArray(LBound(anArray))
End Function
Вы можете даже запулить в
процедуру многомерный массив с любым
колическтвом измерений, а чтобы разобраться,
сколько же у этого массива измерений, нужно
производить обращения к функциям UBound и Lbound до
возникновения ошибки:
Function ItemCount(anArray As Variant)As Long
Dim items As Long, i As Integer
On Error Resume Next
items = UBound(anArray) - LBound(anArray) + 1
For i = 2 to 999
items = items * (UBound(anArray, _
i) - LBound(anArray, i) + 1)
If Err Then Exit For
Next
ItemCount = items
End Function
16. УМЕНЬШИТЬ РАЗМЕР
КОДА, ИСПОЛЬЗУЯ ОПЕРАТОРЫ IIF И SWITCH
VB4 16/32, VB5
Level: Intermediate
Часто бывает целесообразным заменить блок
If...Then...Else более компактной функцией Iif:
' возвращает большую из двух
сравниваемых величин
maxValue = IIf(first >= second,first, second)
Switch - редко используемая
функция, даже в тех многочисленных случаях, когда
она более полезна нежели длиннющий блок If...ElseIf:
' надо узнать, х полижительный,
отрицательный, или равен 0?
Print Switch(x < 0, "negative", x > 0, _
"positive", True, "Null")
Заметим, что значение последней
проверки всегда True, так как три условия являются
взаимно исключающими и избыточными.
17. УСКОРЬТЕ ВАШ КОД
ИСПОЛЬЗОВАНИЕМ CHOOSE
VB3, VB4 16/32, VB5
Level: Beginning
Вы можете использовать Choose
там, где можно заменить массив или построить
таблицы результатов, на стадии компиляции
(compile-time), вместо того, чтобы делать это на стадии
выполнения (run time). Например, если Вам надо знать
значения факториалов чисел от 1 до 10, попробуйте
следующий пример (Choose производит выбор
факториала из набора имеющихся значений всесто
того, чтобы высчитывать факториал каждый раз
заново):
Function Factorial(number As Integer) _
As Long
Factorial = Choose(number, 1, 2, 6, _
24, 120, 720, 5040, 40320, _
362880, 3628800)
End Function
18. GOSUBS РАБОТАЮТ
МЕДЛЕННО В ОТКОМПИЛИРОВАННЫХ ПРОГРАММАХ
VB5
Level: Intermediate
Поскольку использование GoSubs
относится к неструктурированному стилю
программирования, то многие программисты
стараются избегать его. Если Вы компилируете
Вашу VB5 аппликуху в native code, у Вас появится еще одна
причина избегать этот оператор, поскольку вызовы
через GoSubs могут происходить в пять раз медленнее,
чем вызовы обычной процедуры или функции.
19. «ARRAY» - ОТНЫНЕ ЭТО
ОШИБОЧНОЕ ИМЯ ДЛЯ ПЕРЕМЕННЫХ
VB5
Level: Intermediate
Если Вы, как и я, часто
используете имя "array" для переменных, Вам
придется пересмотреть Ваш код при переносе его
под VB5. Это слово является теперь
зарезервированным (reserved keyword) и не может быть
использовано в качестве имени переменной. Вы
можете легко переделать Ваш код при помощи
команды Replace в IDE VB5, не забудьте при этом черкнуть
"Find whole words only".
20. ЗАПУСК AUTOMATION MANAGER
КАК HIDDEN ЗАДАЧИ
VB4 16/32, VB5 Enterprise Edition
Level: Advanced
Если Вы мспользуете OLE Remote
Automation, Вы должны заранее запустить Automation Manager на
сервере до того как случится первая OLE remote
communication. По умолчанию, это приложение visible, но Вы
можете его спрятать, чтобы оно не мозолило глаза
на таскбаре Чикаги. Для этого создайте ярлык для
Automation Manager, который бы включал в командной строке
переключатель /Hidden:
C:\Windows\System\AutMgr32.Exe /Hidden
С другой стороны, Вы можете поменять значение
соответствующего ключа в регистре. Для более
полной инфы, см. Статью Q138067 in the Microsoft Knowledge Base.
21. ПРОБЛЕМЫ СО
ВСПЛЫВАЮЩИМИ МЕНЮ
VB4 16/32, VB5
Level: Advanced
Если Вы используете
всплывающие меню (popup menus) в Ваших прогах, то
опасайтесь бага, имеющегося в VB4 16/32 и VB5. Если у
Вас есть две формы и одна из них вызывает вторую
модальную через всплывающее меню, то из этой
второй модальной Вы не сможете вызвать ни одного
всплывающего меню, сколько бы их на ней ни было.
Чтобы пофиксить это дело, используйте таймер на
первой форме. Вместо показа фторой формы из
всплывающего меню по событию Click, активизируйте
таймер так, чтобы он показал эту вторую форму
через несколько миллисекунд. Для более полной
инфы, см. Статью Q167839 in the Microsoft Knowledge Base.
Назад к
СОДЕРЖАНИЮ
22. ИСПОЛЬЗОВАНИЕ
КОЛЛЕКЦИИ ДЛЯ ОТФИЛЬТРОВЫВАНИЯ ДУБЛИРОВАННЫХ
ЗНАЧЕНИЙ
VB4 16/32, VB5
Level: Intermediate
Этот код иллюстрирует, как использовать
коллекции (Collection) для генерации уникального
набора величин из набора, содержащего дубликаты.
В этом примере, сканируется массив строк и
сортируются все уникальные с использованием
list-box контрола:
Sub Remove_Duplicates(arr() As String)
Dim i As Long
Dim RawData As String
Dim DataValues As New Collection
On Error Resume
Next
' это вставлено для
игнорирования ошибки 457 - Duplicate key
For i = LBound(arr) To UBound(arr)
RawData = arr(i)
DataValues.Add RawData, RawData
' Если Run-time error 457 случилась, то повторяющееся
значение игнорируется
Next
On Error GoTo 0
'
Сохранение в List Box
' (свойство Sorted выставлено
True)
lstSortedData.Clear
For Each DataValue In DataValues
lstSortedData.AddItem DataValue
Next
End Sub
23. СОЗДАНИЕ «УДАЛЕННО
КОНТРОЛИРУЕМЫХ» ФОРМ
VB3
Level: Intermediate
Иногда мне требуется
котролировать одну форму, когда фокус находится
на другой. Например, когда я жму «ОК» на форме А,
мне надо сделать resize на форме В. Итак, на каждой
форме, которую мне надо «удаленно
контролировать», я делаю невидимый text box, назовем
его TextCommand, в событии Change которого находится
следующий код:
Sub TextCommand_Change ()
Dim msg as string
msg = Trim$(Me.TextCommand.Text)
If Len(msg) = 0 Then Exit Sub
Select Case msg
Case "COMMAND_RESIZE"
Call MyFormResize
Case "COMMAND_REPAINT"
Call MyFormPaint
...
End Select
Me.TextCommand = ""
End Sub
Вы можете удаленно
контролировать форму, засылая соответствующее
значение в ее TextCommand:
Sub Command1_Click ()
formB.TextCommand = "COMMAND_RESIZE"
DoEvents
End Sub
Этот код можно использовать для
отсылки мессагов из MDI формы к потомкам:
Dim f As Form
Set f = Me.ActiveForm
f.TextCommand = "COMMAND_RESIZE"
Если Вы сидите под VB4 или VB5, Вы
можете также использовать Public-свойства и методы
формы.
24. ЗАПИСЬ ТЕКУЩЕЙ
ПОЗИЦИИ И РАЗМЕРА ФОРМЫ ПРИ ПОМОЩИ SAVESETTING
VB4 16/32, VB5
Level: Intermediate
Функции SaveSetting и GetSetting облегчают написание
сеттингов в аппликухах. Эти две функции
восстанавливают и запоминают текущие позиции
формы:
Public Sub FormPosition_Get(F As Form)
' Считывает позицию формы F из
' ini/reg файла и соответственно
' позиционирует форму
Dim buf As String
Dim l As Integer, t As Integer
Dim h As Integer, w As Integer
Dim pos As Integer
buf = GetSetting(app.EXEName, _
"FormPosition", F.Tag, "")
If buf = "" Then
' defaults для центрирования
фромы
F.Move (Screen.Width - F.Width) \ _
2, (Screen.Height - F.Height) \ 2
Else
' выделить l,t,w,h и
выставить форму
pos = InStr(buf, ",")
l = CInt(Left(buf, pos - 1))
buf = Mid(buf, pos + 1)
pos = InStr(buf, ",")
t = CInt(Left(buf, pos - 1))
buf = Mid(buf, pos + 1)
pos = InStr(buf, ",")
w = CInt(Left(buf, pos - 1))
h = CInt(Mid(buf, pos + 1))
F.Move l, t, w, h
End If
End Sub
Public Sub FormPosition_Put(F As Form)
' Пишет op,left,height и
' width позиции формы F в reg/ini файл аппликухи
Dim buf As String
buf = F.left & "," & F.top & "," & _
F.Width & "," & F.Height
SaveSetting app.EXEName,_
"FormPosition", F.Tag, buf
End Sub
Вам следует поместить эти
процедуры в модуль и вызывать их из событий Load и
Unload форм. Вы должны написать имя формы в ее
свойство Tag, чтобы эти процедуры работали
корректно
Sub Form_Load()
FormPosition_Get Me
End Sub
Sub Form_Unload()
FormPosition_Put Me
End Sub
Назад к
СОДЕРЖАНИЮ
25. ЭФФЕКТИВНОЕ
ИСПОЛЬЗОВАНИЕ ВНУТРЕННИХ VB КОНСТАНТ
VB4 16/32, VB5
Level: Beginning
Мне приходилось видеть
некоторые советы по использованию числовых
значений вместо соответствующих VB констант.
Например, Вы можете вывести message box, используя
числовые константы:
rc = MsgBox(msg, 4 + 32 + 256, "Confirm Delete")
Но не легче ли прочесть
следующее?
rc = MsgBox(msg, vbYesNo + vbQuestion _
+ vbDefaultButton2, _
"Confirm Delete")
Вы можете использовать
следующие константы для check box:
VbUnchecked =0
VbChecked =1
VbGrayed =2
Также полезно знать строковые
константы вместо соответствующих chr$(символы ASCII):
vbTab instead of Chr$(9)
vbCr instead of Chr$(13)
vbLf instead of Chr$(10)
vbCrLf instead of Chr$(13)+Chr$(10)
Назад к
СОДЕРЖАНИ
26 ПРАВИЛЬНЫЙ ТЕСТ НА
"FILE EXIST"
VB3, VB4 16/32, VB5
Level: Intermediate
Dir$ генерирует runtime error, если ему
суют несуществующее имя диска. Например, Dir$
("d:\win\himems.sys") умирает , если драйв d: не
существует. Для проверки существования файла,
добавьте обработчик ошибки:
Function FileExist(filename As String) _
As Boolean
On Error Resume Next
FileExist = Dir$(filename) <>
""
If Err.Number <> 0 Then FileExist _
= False
On Error GoTo 0
End Function
27. ПРОЦЕДУРЫ,
РАБОТАЮЩИЕ С ГРУППАМИ КОНТРОЛОВ
VB4 16/32, VB5
Level: Intermediate
Вы можете использовать почти
забытую возможность VB иметь процедуру или
функцию, работающую с неограниченным числом
аргументов, что может быть полезно при работе с
множеством контролов. Например, Вы можете
enable/disable группу контролов одним вызовом
процедуры:
EnableAll True, Text1, Text2, _
Command1, Command2
Эта процедура проходит по всем
контролам, передаваемым в качестве аргументов:
Sub EnableAll(Enabled As Boolean, _
ParamArray objs() As Variant)
Dim obj As Variant
For Each obj In objs
obj.Enabled = Enabled
Next obj
End Sub
28 УЛУЧШЕНИЕ
СКРОЛЛИНГА РИСУНКОВ
VB3, VB4 16/32, VB5
Level: Intermediate
Во-первых, сделайте, чтобы событие Scroll скроллбара
картинки обновляло координаты картинки (как
будто бы она движется) когда Вы возите мышой по
картинке. Затем, объявите следующие переменные
на уровне формы:
Dim StartX As Long, StartY As Long
Dim Moving As Boolean
Finally, declare these three events for PicPicture:
Наконец, объявите эти три события для PicPicture:
Private Sub PicPicture_MouseDown_
(Button As Integer, Shift As _
Integer, x As Single, y As Single)
StartX = x
StartY = y
Moving = True
End Sub
Private Sub PicPicture_MouseMove_
(Button As Integer, Shift As _
Integer, x As Single, y As Single)
If Moving Then
PicPicture.Move _
PicPicture.Left + x - StartX, PicPicture.Top + y - StartY
End If
End Sub
Private Sub PicPicture_MouseUp_
(Button As Integer, Shift As _
Integer, x As Single, y As Single)
Moving = False
End Sub
Теперь Вы можете скроллить
картинку мышой. Не забудьте проверить границы
картинки.
Назад к СОДЕРЖАНИЮ
29. ЗАШИФРОВАННЫЕ
ПАРОЛИ
VB3, VB4 16/32, VB5
Level: Intermediate
Следующие две функции легко и
эффективно шифрут/дешифруют текстовый пароль.
Функции имеют два аргумента: число от 1 до 10 чтобы
сдвигать позицию символа ASCII в пароле, и
собственно строка пароля. Функция EncryptPassword
проходит через каждый символ строки DecryptedPassword,
проверяет символ на четность/нечетность, и
сдвигает его вверх/вниз согласно параметру Number.
Эту делает зашифрованную строку нечитабельной.
Зашифрованный пароль «укатывается» затем
оператором XOR, который еще более запутывает
строку. Я ограничил параметр Number числом 10,
поскольку мне не надо делать проверку на
«неправильные» символы ASCII. Функция DecryptPassword
повторяет в обратном порядке процесс шифрования,
применяя XOR, а затем сдвиг.
Function EncryptPassword(Number As _
Byte, DecryptedPassword As String)
Dim Password As String, Counter As Byte
Dim Temp As Integer
Counter = 1
Do Until Counter = _
Len(DecryptedPassword) + 1
Temp = Asc(Mid(DecryptedPassword, _
Counter, 1))
If Counter Mod 2 = 0 Then
'see if even
Temp = Temp - Number
Else
Temp = Temp + Number
End If
Temp = Temp Xor (10 - Number)
Password = Password & Chr$(Temp)
Counter = Counter + 1
Loop
EncryptPassword = Password
End Function
Function DecryptPassword(Number As _
Byte, EncryptedPassword As String)
Dim Password As String, Counter As Byte
Dim Temp As Integer
Counter = 1
Do Until Counter = _
Len(EncryptedPassword) + 1
Temp = Asc(Mid(EncryptedPassword, _
Counter, 1)) Xor (10 - Number)
If Counter Mod 2 = 0 Then 'see if even
Temp = Temp + Number
Else
Temp = Temp - Number
End If
Password = Password & Chr$(Temp)
Counter = Counter + 1
Loop
DecryptPassword = Password
End Function
Назад к
СОДЕРЖАНИЮ
30. ПРОПИСНЫЕ-СТРОЧНЫЕ
БУКВЫ - СОВЕТ ПО СЛЕЖЕНИЮ ЗА РЕГИСТРОМ БУКВ
VB4 16/32, VB5
Level: Intermediate
Если Вы используете левую стрелку на клаве, чтобы
перейти к началу слова, а затем нажимаете букву,
то в итоге Вы получаете две заглавных буквы
(первая уже была, а вторую ввели Вы - я так
понимаю??). Применив код, который использует
преимущества встроенной в VB4/VB5 функции StrConv(), Вы
получите автоматическое приведение букв в
нужный регистр во время ввода:
Private Sub Text1_Change()
If Text1.Tag = "" Then
Text1.Tag = Text1.SelStart
Text1.Text = StrConv(Text1.Text, vbProperCase)
Text1.SelStart = Text1.Tag
Text1.Tag = ""
End If
End Sub
Назад к
СОДЕРЖАНИЮ
|